package com.disdr.utils;

import com.disdr.picture.图片网格化;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;

public class 签名抠图 {

    private static int minX = 10000;
    private static int maxX = 0;
    private static int minY = 10000;
    private static int maxY = 0;

    public static void main(String[] args) throws Exception {

        //背景图片（默认是黑色）
        BufferedImage bg = new BufferedImage(900, 2000, BufferedImage.TYPE_INT_RGB);
        //BufferedImage bg = ImageIO.read(new File("D:\\user\\Desktop\\收据1.jpg"));
        Graphics2D g2 = (Graphics2D) bg.getGraphics();
        g2.setColor(Color.RED); // 设置背景颜色
        g2.fillRect(0, 0, 900, 2000);// 填充整张图片(其实就是设置背景颜色)

        File file = new File("src\\main\\resources\\templates\\博洋行书.png");
        BufferedImage bi = ImageIO.read(file);
        System.out.println(bi.getWidth()+":"+bi.getHeight());
        for(int y = 0 ; y<10 ; y++){
            for(int x = 0 ; x<10 ; x++){
                int xx = (int)Math.round(new Double(x)*85.9);
                //int xx = new BigDecimal(x).multiply(new BigDecimal(85.9)).intValue();
                int yy = new BigDecimal(y).multiply(new BigDecimal(80)).intValue()+1;
                签名抠图(bg,80+(x*55),130+(y*55),1, bi.getSubimage(xx,yy,86,80));
                System.out.println(xx+","+yy);
            }
        }
        /*for(int i = 1 ; i<11 ; i++){
            if(i==1){
                签名抠图(bg,200+(i*35),130+25,28, 图片网格化.getImg(String.valueOf(i-1)));
           *//* }else if(i==2){
                签名抠图(bg,200+(i*25)-10,130+25,28, 图片网格化.getImg(String.valueOf(i-1)));*//*
            }else {
                签名抠图(bg,200+(i*35)-10,130+(i*2),35, 图片网格化.getImg(String.valueOf(i-1)));
            }
        }*/

        // 保存图片 JPEG表示保存格式
        ImageIO.write(bg, "jpg", new FileOutputStream("D:\\user\\Desktop\\抠图.jpg"));
    }

    /**
     * 黑色签名
     * @param bg
     * @param 坐标X
     * @param 坐标Y
     * @param 字体大小
     * @param bi
     * @throws IOException
     */
    public static void 签名抠图(BufferedImage bg,Integer 坐标X,Integer 坐标Y,Integer 字体大小,BufferedImage bi) throws IOException {

        //System.out.println("bi.getWidth():"+bi.getWidth());
        //System.out.println("bi.getHeight():"+bi.getHeight());
        for(int y = bi.getMinY();y<bi.getHeight();y++ ){
            for(int x = bi.getMinX();x<bi.getWidth();x++ ){
                int rbg = bi.getRGB(x,y);
                if(colorInRange(rbg)){
                    set(x,y);
                }
            }
        }

        /*System.out.println(minX);
        System.out.println(maxX);
        System.out.println(minY);
        System.out.println(maxY);*/

        //原始大小
        /*for(int y = bi.getMinY();y<bi.getHeight();y++ ){
            for(int x = bi.getMinX();x<bi.getWidth();x++ ){
                int rbg = bi.getRGB(x,y);
                if(colorInRange(rbg)){
                    bg.setRGB(x,y,rbg);
                }
            }
        }*/

        BigDecimal 缩小比例 = new BigDecimal(字体大小);
        if(字体大小>10){
            缩小比例 = new BigDecimal(字体大小).divide(new BigDecimal(maxY-minY),2,1);
        }

        for(int y = bi.getMinY();y<bi.getHeight();y++ ){
            for(int x = bi.getMinX();x<bi.getWidth();x++ ){
                int rbg = bi.getRGB(x,y);
                try{
                    if(colorInRange(rbg)){
                        int xx = new BigDecimal(x-minX).multiply(缩小比例).intValue();
                        int yy = new BigDecimal(y-minY).multiply(缩小比例).intValue();
                        bg.setRGB(xx+坐标X,yy+坐标Y,rbg);
                    }
                }catch (Exception ex){
                    System.out.println("坐标X:"+坐标X);
                }
            }
        }
    }

    /**
     * 色差对比
     * @param color
     * @return
     */
    private static boolean colorInRange(int color){
        int red = (color & 0xff0000) >> 16;// 获取color(RGB)中R位
        int green = (color & 0x00ff00) >> 8;// 获取color(RGB)中G位
        int blue = (color & 0x0000ff);// 获取color(RGB)中B位

        //黑色签名
        if(red< 100 && green<100 && blue<100){
            return true;
        }
        return false;
    }

    /**
     * 定位文字占位区域
     * @param x
     * @param y
     */
    private static void set(int x,int y){
        if(x<minX){
            minX=x;
        }
        if(x>maxX){
            maxX=x;
        }
        if(y<minY){
            minY=y;
        }
        if(y>maxY){
            maxY=y;
        }
    }
}
